#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <string.h>
#include <unistd.h>

union semun{ int val; };

int main( void ) {
	int shmid = shmget(1234, sizeof(int), IPC_CREAT|0600);
	if ( shmid == -1 ) perror("shmget"),exit(1);

	// 创建信号量
	int semid = semget(1234, 1, IPC_CREAT|0600);
	if ( semid == -1 ) perror("semget"),exit(1);

	// 初始化信号量
	union semun su;
	su.val = 0;
	semctl(semid, 0, SETVAL, su);
	
	// 将共享内存挂载到自己的虚拟地址空间
	int *p = (int*)shmat(shmid, NULL, 0);

	int num = 1;
	struct sembuf sb[1] = { {0,1,0} };
	// 每隔一秒钟往共享内存写入数据
	while ( 1 ) {
		sleep(1);
		*p = num++;
		semop(semid, sb, 1);// V操作
	}

	// 卸载共享内存
	shmdt(p);
}

